perm filename INTFAC.PAL[AL,HE] blob sn#390164 filedate 1978-10-24 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	.TITLE INTFAC
C00003 00003	ARM INTERFACE DEFINITIONS
C00005 00004	PROGRAM INITIALIZATION
C00007 00005	ADC TEST SECTION
C00010 00006	SUBRS AND CLOCK INTERRUPT ROUTINE
C00012 00007	LOCAL STORAGE
C00014 ENDMK
CāŠ—;
.TITLE INTFAC

;REGISTER DEFINITIONS

R0	=%0
R1	=%1
R2	=%2
R3	=%3
R4	=%4
R5	=%5
SG	=%5
SP	=%6
PC	=%7


;OTHER RANDOM DEFINITIONS

CLKSET	=172542		;CLOCK SET REGISTER
CLKS	=172540		;CLOCK STATUS
CLKTRP	=104		;CLOCK TRAP
LV7	==340		;LEVEL 7 CPU STATUS
DDT	=130000		;DEBUGGER
STKTOP	=1000		;TOP OF USER STACK


;I/O ROUTINES START HERE

.=STKTOP
LSI	==0
TALK10	==1
NOCOMA	==0
BADNUM	==0
ABORT	==0
;.INSRT IO.PAL[NEW,BES]
.INSRT ALHEAD.PAL[AL,HE]
.INSRT IO.PAL[AL,HE]
;ARM INTERFACE DEFINITIONS

DRATRP	=310  		;DR11 A VECTOR 	
DRBTRP	=314  		;DR11 B VECTOR	
DR11S	=167770 	;DR11 STATUS WORD
DR11O	=167772		;DR11 OUTPUT REGISTER
DR11I	=167774 	;DR11 INPUT REGISTER

;DR11C STATUS REGISTER BIT DEFINITIONS

DACMDE	==0		;CSR MODE BITS, DAC MODE
BRKMDE	==1		; "   "    "  , BRAKE REGISTER MODE
ADCMDE	==2		; "   "    "  , ADC MODE
STTMDE	==3		; "   "    "  , STATUS REGISTER READ MODE
ADCENB	==100		;ADC INTERRUPT ENABLE BIT
ADCDNE	==200		;ADC DONE BIT
STTENB	==40		;STATUS REGISTER INTERRUPT ENABLE BIT
STTREQ	==100000		;STATUS REGISTER REQUEST INTERRUPT BIT

;DR11C ARM STATUS REGISTER BIT DEFINITIONS

PANIC 	==200		;PANIC BUTTON BIT MASK
TOUCH0	==1		;TOUCH SENSOR BIT MASKS
TOUCH1	==2

;DR11C BRAKE REGISTER BIT ASSIGNMENTS

ARMBRK	==77		;ARM BRAKE BITS
HNDBRK	==100		;HAND BRAKE BIT
ENBTCH	==4000		;ENABLE TOUCH SENSOR INTERRUPT
ENABLE	==100000	;INTERFACE ENABLE
;PROGRAM INITIALIZATION

START:	RESET
	MOV	#1000.,CLKSET
	MOV 	#STKTOP,SP	;INITIALIZE STACK POINTER
	MOV	#CLKSER,CLKTRP	;SET UP CLOCK VECTOR
	MOV	#LV7,CLKTRP+2
 
;ASK IF DAC OR ADC CHECK
 
	MOV	#COM1,SG	;ADC OR DAC MODE?
	JSR	PC,GETNUM
	BNE	ISADC

;DAC TEST SECTION
 
DACSEC:	CLR	DR11S		;SET DR11 DAC MODE
	MOV	#COM2,SG	;GET DAC CHANNEL
	JSR	PC,GETNUM
	MOVB	BRK(R0),R1	;GET BRAKE MASK BIT
	BIS	#ENABLE,R1	;ADD ON INTERFACE ENABLE BIT
	MOV	R1,BRKMSK
	ASH	#13.,R0
	MOV	R0,DACCHN	;SAVE DAC CHANNEL
	MOV	#COM4,SG	;GET DC DAC VALUE
	JSR	PC,GETNUM
	MOV	R0,DACDC
	MOV	#COM5,SG
	JSR	PC,GETNUM	;GET DAC RAMP VALUE
	MOV	R0,DACCHG
	CLR	COUNT
	CLR	PDAC		;START AT BOTTOM OF RAMP
	CLR	PTIME		;INDICATE FIRST PASS THROUGH
	CLR	NOPANC		;PANIC BUTTON NOT HIT
	MOV	#111,CLKS	;START THE CLOCK RUNNING
CLKWT:	TST	NOPANC		;PANIC BUTTON HIT?
	BNE	DACDN
	JSR	PC,TICKLE	;SOMEONE TICKLE THE TTY?
	BCC	CLKWT		;LOOP TILL SOMETHING HAPPENS
DACDN:	CLR	CLKS		;STOP THE CLOCK
	MOV	#COM14,SG	;EXIT
	JSR	PC,LINOUT
	JMP	DDT
;ADC TEST SECTION
  
ISADC:	MOV	#COM6,SG	;ASK IF TYPE OUT REQUESTED
	JSR	PC,GETNUM
	MOV	R0,TYPADC
	MOV	#COM8,SG	;GET STARTING CHANNEL
	JSR	PC,GETNUM
	BIC	#177740,R0
	MOV	R0,ADCCHN	;SAVE START CHANNEL
	MOV	#COM7,SG	;NUMBER OF CHANNELS TO PRINT
	JSR	PC,GETNUM
	CMP	#32.,R0		;IN RANGE
	BGE	.+6
	MOV 	#32.,R0		;NO
	TST	R0
	BGT	.+6
	MOV	#1,R0
	ADD	ADCCHN,R0	;LAST CHANNEL NUMBER TO PRINT
	DEC	R0
	MOV	R0,MAXCHN
	MOV	#ADCMDE,DR11S	;SET ADC MODE
	TST	TYPADC		;CLEAR THE SCREEN
	BEQ	ADCSTR		;NO
	MOV	#TOPCLR,SG	;YES
	JSR	PC,TYPSTR
 
;ADC LOOP
 
ADCSTR:	MOV	ADCCHN,R3	;FIRST CHANNEL NUMBER
	MOV	#SPACER,R4	;THESE ARE SPACERS BETWEEN TYPEOUT
	TST	TYPADC		;CHECK IF TYPE OUT REQUIRED
	BEQ	ADCLP		;NO
	JSR	PC,CRLF		;YES
	CMP	MAXCHN,ADCCHN	;MORE THAN 1 CHANNEL?
	BEQ	ADCLP		;NO
	MOV	#TOP,SG		;YES, MOVE TO TOP OF SCREEN
	JSR	PC,TYPSTR
ADCLP:	MOV	R3,DR11O	;SEND OFF DESIRED CHANNEL NUMBER
	MOV	#100.,R1	;WAIT LOOP COUNT
WAITLP:	BIT	#ADCDNE,DR11S
	BNE	ADCFIN		;BRANCH IF DONE
	DEC	R1
	BGE	WAITLP		;REPEAT IF STILL MORE TIME LEFT
	MOV	#COM9,SG
	JSR	PC,LINOUT
	BR	ADCLDN
ADCFIN:	MOV	DR11I,R0	;GET ADC READING
	TST	TYPADC		;CHECK IF TYPE OUT REQUIRED
	BEQ	TSTDNE 		;NO
	MOV	#IOBUF,SG
	JSR	PC,PRTINT	;CONVERT TO ASCII
	MOV	#IOBUF,SG	;TYPE OUT READING
	JSR	PC,TYPSTR
	MOV	R4,SG		;TYPE OUT SPACER
	MOV	(SG)+,R4	;POINT TO NEXT SPACER
	JSR	PC,TYPSTR
TSTDNE:	JSR	PC,TICKLE	;TTY TICKLED?
	BCS	ADCLDN		;YES
	INC	R3		;NEXT CHANNEL NUMBER
	CMP	MAXCHN,R3	;END OF LIST
	BLT	ADCSTR		;YES
	BR	ADCLP		;NO

ADCLDN:	MOV	#COM14,SG	;EXIT
	JSR	PC,LINOUT
	JMP	DDT
;SUBRS AND CLOCK INTERRUPT ROUTINE
 
GETNUM:	JSR	PC,TYPSTR	;TYPE OUT QUESTION
	MOV	#IOBUF,SG	;GET THE REPLY
	JSR	PC,INSTR
	JSR	PC,GETINT
	MOV	#COM13,SG	;REPEAT IF BAD NUMBER
	BCS	GETNUM
	TST	R0
	RTS	PC
 

CLKSER:	MOV	DACDC,R0	;GET DAC OUTPUT VALUE
	ADD	PDAC,R0
	MOV	R0,R1
	BGE	.+4		;CHECK IF IN RANGE
	NEG	R1
	CMP	#4000,R1
	BGE	VALOK		;BRANCH IF OK
	MOV	DACDC,R0	;ELSE START OVER AT DC VALUE
	MOV	DACCHG,PDAC
	NEG	PDAC
 
;	MOV	#1,DR11S	;USE THIS TO SYNC ON WHEN TESTING
;	MOV	BRKMSK,DR11O	
 
VALOK:	TST	PTIME		;CHECK IF NOT FIRST PASS THROUGH
	BNE	1$		;BRANCH IF NOT PASS ONE
	MOV	#1,DR11S	;ELSE SET BRAKE MODE
	MOV	BRKMSK,DR11O 	;TURN OFF BRAKE AND ENABLE INTERFACE
	INC	PTIME		;INDICATE END OF FIRST PASS
1$:	BIC	#170000,R0
	BIS	DACCHN,R0	;ADD DAC CHANNEL
	CLR	DR11S
	MOV	R0,DR11O
	ADD	DACCHG,PDAC
	MOV	#STTMDE,DR11S	;GET ARM STATUS BITS     
	MOV	DR11I,R0	
 	BIT	#PANIC,R0	;CHECK IF PANIC BUTTON HIT
 	BEQ	STPIT		;STOP SERVICING IF BUTTON HIT
	RTI

STPIT:	INC	NOPANC
	MOV	#BRKMDE,DR11S	;SET THE BRAKES
	CLR	DR11O
	RTI
;LOCAL STORAGE
 
BRK:	.BYTE	1,2,4,10,20,40,100,0
BRKMSK:	0
NOPANC:	0
DACCHN:	0
DACDC:	0
DACCHG:	0
PDAC:	0
COUNT:	0
PTIME:	0
TYPADC:	0
INDX:	0
ADCCHN:	0
MAXCHN:	0

 
;OUTPUT STRINGS
 
COM1:	.ASCIZ	/DAC OR ADC(0:1) = /
COM2:	.ASCIZ	/DAC NUMBER (0:7) = /
COM4:	.ASCIZ	/DAC DC VALUE (-2048 : 2047) = /
COM5:	.ASCIZ	/DAC CHANGE EVERY 10 MSEC = /
COM6:	.ASCIZ	/TYPE ADC READINGS (0:1)? = /
COM7:	.ASCIZ	/NUMBER OF CHANNELS TO PRINT (1:32) = /
COM8:	.ASCIZ	/ADC CHANNEL (0:31) = /
COM13:	.ASCIZ	/**ILLEGAL NUMBER**, TRY AGAIN = /
COM9:	.ASCIZ	/**ERROR** NO ADC DONE SIGNALED/
COM14:	.ASCIZ	/EXITING TO DDT/

TOP:	.BYTE	35,10,10,10,10,0
TOPCLR:	.BYTE	35,35,37,37,37,10,10,10,0

	.EVEN

SPACER:	SPACE2
	.ASCIZ	/*  /
SPACE1:	SPACE2
	.ASCIZ	/   /
SPACE2:	SPACE3
	.ASCIZ	/   /
SPACE3:	SPACE4
	.ASCIZ	/   /
SPACE4:	SPACE1
	.BYTE	15,12,0,0
	.EVEN


IOBUF:	.=.+200
PATCH:	.=.+300


.END START